更新时间:2023-07-16 21:43
Java Pool(Java 池)是为了减少资源创建、初始化的系统开销而采取的一种实现模式。
我们需要使用Connection Pool的情况都通常都是指网络连接,比如:DB connection, Socket的Connection,这些对象往往需要使用Pool来管理,因为这些对象的重复创建需要较长的时间,是系统性能的瓶颈。
Connection Pool实现包括两类:第一种是受管的Connection Pool,需要实现JCA的Resource Adapter规范,通过JNDI lookup出来ConnectionPool对象,然后调用受管ConnectionPool对象的getConnection方法获得connection,第二种是自己实现一个Connection的Object Pool,通过自定义的ConnectionFactory类获得一个connection。
第一种:受管的Connection Pool
目前J2EE Container中常用的connection pool有:
DB Connection Pool
JMSConnection Pool
LDAPConnection Pool
JCA Connection Pool
DB Connection Pool即JDBC connection pool,基本上所有的J2EE容器都提供了实现,JMS connection pool一般的JMS Server都提供了实现,LDAP connection pool由LDAP Server提供实现, JCA connection pool需要自己实现resource adapter。
第二种:实现一个Connection的Object Pool
通常可以在已有第三方的Object Pool上实现自己的Connection Pool,如apache的commons pool,如果非要从头开始当然也是可以的。通常如果是要用规范的API获取connection,如jdbc,jms,举个例子:DriverManager.getConnection, Connection.close, 为了使这个Connection Pool可以方便地用在各种jdbc驱动上,而且为了使原来没有使用该Connection Pool的应用可以方便地切换到该Connection Pool上,我们可能需要用到AOP,这样DriverManager.getConnection就是从pool中取出connecton(如果pool中有的话),Connection.close就是return给pool,从逻辑上释放。用OO的方法也是可以实现的。
应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可以集中精力处理应用程序任务。
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙.如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值.超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
实现一个资源池,一般要实现以下方法: 1、用Vector作为池中存储元素的容器。之所以使用Vector,而不是Map、List等,是基于Vector线程安全考虑;
2、实现池中元素的获取、释放功能;
3、实现池的finalize方法,保证系统在垃圾回收时正确回收目前处于idle状态的资源,保证正在被使用的资源不被系统回收。